package com.epcs.controller.action;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.dispatcher.SessionMap;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.SessionAware;


import com.epcs.model.bo.FollowingBO;
import com.epcs.model.dto.Account;
import com.epcs.model.dto.Event;
import com.epcs.model.dto.Following;
import com.epcs.model.dto.MostFollowingList;
import com.opensymphony.xwork2.ActionSupport;

public class MostFollowingAction extends ActionSupport implements SessionAware,
		ServletRequestAware {
	private SessionMap<String, Object> sessionMap;
	private HttpServletRequest request;
	private int pageNumber;

	public String showMostFollowing() {
		String result = "Success";
		FollowingBO followBO = new FollowingBO();
		Account account = (Account) sessionMap.get("USER_INFO");
		// Khởi tạo số event muốn lấy ra
		int maxRecord = 10;
		// lấy list eventiD được following nhiều nhất
		List<Object> objectList = followBO.getMostFollowingEventList(1, maxRecord, account);
		
		if(objectList.size() > 0){
			// xác định ng dùng đã following event hay chưa
			List<Following> listFollowing = new ArrayList<Following>();
			// kiểm tra list khác null
			List<MostFollowingList> mostFollowingList = ((List<MostFollowingList>) objectList.get(0));
			List<Event> listEvent = (List<Event>) objectList.get(1);

			if (listEvent != null) {
				if (listEvent.size() > 0) {
					/**
					 * Giải thích: nếu user chưa follow event thì giá trị được thêm
					 * vào listFollowing là null. Nếu khác null, tức là user đã
					 * follow
					 */

					for (int i = 0; i < listEvent.size(); i++) {
						Event event = listEvent.get(i);
						listFollowing.add(followBO.loadFollowing(account,
								event.getEventId()));
					}

					List listNumberOfFollow = new ArrayList();
					for (int i = 0; i < mostFollowingList.size(); i++) {
						MostFollowingList mostFollowingItem = mostFollowingList
								.get(i);
						listNumberOfFollow.add(mostFollowingItem.getCountById());
					}
					request.setAttribute("FOLLOWING_EVENT_LIST", listFollowing);
					request.setAttribute("MOST_FOLLOWING_EVENT_LIST",
							objectList.get(1));
					request.setAttribute("NUMBER_OF_FOLLOWING", listNumberOfFollow);
				} else {
					// chú ý request đến trang bắt buộc following

					// tạm thời show message bạn chưa following category nào
					request.setAttribute("WARNING_MESSAGE",
							"Không có sự kiện mới nào thuộc các thể loại mà bạn đang theo dõi!<br/>Bạn có thể theo dõi thêm các thể loại được gợi ý bên dưới nhằm giúp hệ thống tìm kiếm cho bạn tốt hơn...");
					request.setAttribute("LOAD_TOP_CATEGORY",true);
					result = "GetCategoryPage";
				}

			} else {
				// chú ý request đến trang bắt buộc following

				// tạm thời show message bạn chưa following category nào
				request.setAttribute("WARNING_MESSAGE",
						"Bạn chưa theo dõi bất kỳ thể loại nào!<br/>Bạn có thể theo dõi các thể loại được gợi ý bên dưới...");
				request.setAttribute("LOAD_TOP_CATEGORY",true);
				result = "GetCategoryPage";
			}
		}else {
			// chú ý request đến trang bắt buộc following

			// tạm thời show message bạn chưa following category nào
			request.setAttribute("WARNING_MESSAGE",
					"Bạn chưa theo dõi bất kỳ thể loại nào!<br/>Bạn có thể theo dõi các thể loại được gợi ý bên dưới...");
			request.setAttribute("LOAD_TOP_CATEGORY",true);
			result = "GetCategoryPage";
		}
		
		return result;
	}
	
	public String getMoreMostFollowing() {
		FollowingBO followBO = new FollowingBO();
		Account account = (Account) sessionMap.get("USER_INFO");
		// Khởi tạo số event muốn lấy ra
		int maxRecord = 10;
		// lấy list eventiD được following nhiều nhất
		List<Object> objectList = followBO.getMostFollowingEventList(pageNumber, maxRecord, account);
		
		if(objectList.size() > 0){
			// xác định ng dùng đã following event hay chưa
			List<Following> listFollowing = new ArrayList<Following>();
			// kiểm tra list khác null
			List<MostFollowingList> mostFollowingList = ((List<MostFollowingList>) objectList.get(0));
			List<Event> listEvent = (List<Event>) objectList.get(1);
			
			if (listEvent != null) {
				if (listEvent.size() > 0) {
					/**
					 * Giải thích: nếu user chưa follow event thì giá trị được thêm
					 * vào listFollowing là null. Nếu khác null, tức là user đã
					 * follow
					 */
					
					for (int i = 0; i < listEvent.size(); i++) {
						Event event = listEvent.get(i);
						listFollowing.add(followBO.loadFollowing(account,
								event.getEventId()));
					}
					
					List listNumberOfFollow = new ArrayList();
					for (int i = 0; i < mostFollowingList.size(); i++) {
						MostFollowingList mostFollowingItem = mostFollowingList
								.get(i);
						listNumberOfFollow.add(mostFollowingItem.getCountById());
					}
					request.setAttribute("FOLLOWING_EVENT_LIST", listFollowing);
					request.setAttribute("MOST_FOLLOWING_EVENT_LIST",
							objectList.get(1));
					request.setAttribute("NUMBER_OF_FOLLOWING", listNumberOfFollow);
				} else {
					request.setAttribute("EMPTY_LIST", true);
				}
				
			} else {
				request.setAttribute("EMPTY_LIST", true);
			}
		}else {
			request.setAttribute("EMPTY_LIST", true);
		}
		
		return "Success";
	}

	// ---------------- session --------------------//

	@Override
	public void setSession(Map<String, Object> sessionMap) {
		this.sessionMap = (SessionMap<String, Object>) sessionMap;
	}

	@Override
	public void setServletRequest(HttpServletRequest request) {
		this.request = request;

	}

	// ---------------- getter setter--------------//
	
	public int getPageNumber() {
		return pageNumber;
	}

	public void setPageNumber(int pageNumber) {
		this.pageNumber = pageNumber;
	}
}
